<?php
/**
 * 通用的树型类，可以生成任何树型结构
 */
class Tree_pubu
{
    /**
    * 生成树型结构所需要的2维数组
    * @var array
    */
    public $arr = array();

    /**
    * 生成树型结构所需修饰符号，可以换成图片
    * @var array
    */
    public $icon = array('│','├','└');
    public $nbsp = "&nbsp;";

    /**
    * @access private
    */
    public $ret = '';

    public function init($arr = array())
    {
        $this->arr = $arr;
        $this->ret = '';
        $this->str = '';
        return is_array($arr);
    }

    /**
    * 得到父级数组
    * @param int
    * @return array
    */
    public function get_parent($myid)
    {
        $newarr = array();
        if(!isset($this->arr[$myid])) return false;
        $pid = $this->arr[$myid]['parentid'];
        $pid = $this->arr[$pid]['parentid'];
        if(is_array($this->arr))
        {
            foreach($this->arr as $id => $a)
            {
                if($a['parentid'] == $pid) $newarr[$id] = $a;
            }
        }
        return $newarr;
    }

    /**
    * 得到子级数组
    * @param int
    * @return array
    */
    public function get_child($myid)
    {
        $a = $newarr = array();
        if(is_array($this->arr))
        {
            foreach($this->arr as $id => $a)
            {
                if($a['parentid'] == $myid) $newarr[$id] = $a;
            }
        }
      //  print_r($newarr);exit;
        return $newarr ? $newarr : false;
    }
    public function for_get_child($myid)
    {
    	$CI =& get_instance();
    	$bdb = $CI->load->database('basis', TRUE);
    	$bdb->select('category_id');
    	$bdb->where('parent_id',$myid);
    	$query = $bdb->get('pubu_category');
    	if ($query->num_rows() > 0){
    		return true;
    	}
    	else{
    		return false;
    	}
    }


    public function car_for_get_child($myid,$databsename,$tablename,$fieldname,$where_fieldname)
    {
    	$CI =& get_instance();
    	$bdb = $CI->load->database($databsename, TRUE);
    	$bdb->select($fieldname);
    	$bdb->where($where_fieldname,$myid);
    	$query = $bdb->get($tablename);
    	if ($query->num_rows() > 0){
    		return true;
    	}
    	else{
    		return false;
    	}
    }
    /**
    * 得到当前位置数组
    * @param int
    * @return array
    */
    public function get_pos($myid,&$newarr)
    {
        $a = array();
        if(!isset($this->arr[$myid])) return false;
        $newarr[] = $this->arr[$myid];
        $pid = $this->arr[$myid]['parentid'];
        if(isset($this->arr[$pid]))
        {
            $this->get_pos($pid,$newarr);
        }
        if(is_array($newarr))
        {
            krsort($newarr);
            foreach($newarr as $v)
            {
                $a[$v['id']] = $v;
            }
        }
        return $a;
    }

    /**
    * 得到树型结构
    * @param int ID，表示获得这个ID下的所有子级
    * @param string 生成树型结构的基本代码，例如："<option value=\$id \$selected>\$spacer\$name</option>"
    * @param int 被选中的ID，比如在做树型下拉框的时候需要用到
    * @return string
    */
    public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
    {
        $number=1;
        $child = $this->get_child($myid);
        if(is_array($child))
        {
            $total = count($child);
            foreach($child as $id => $a)
            {
                $j=$k='';
                if($number==$total)
                {
                    $j .= $this->icon[2];
                }else{
                    $j .= $this->icon[1];
                    $k = $adds ? $this->icon[0] : '';
                }

                $spacer = $adds ? $adds.$j : '';
                //echo $a['id'].'-'.$sid."<br />";
                $selected = $a['id'] == $sid ? 'selected' : '';
                //$selected = $this->have($sid,$id) ? 'selected' : '';
                @extract($a);
                $parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
                $this->ret .= $nstr;
                $nbsp = $this->nbsp;
                $this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group);
                $number++;
            }
        }
        return $this->ret;
    }

    /**
    * 同上一方法类似,但允许多选
    */
    public function get_tree_multi($myid, $str, $sid = 0, $adds = '')
    {
        $number=1;
        $child = $this->get_child($myid);
        if(is_array($child))
        {
            $total = count($child);
            foreach($child as $id=>$a)
            {
                $j=$k='';
                if($number==$total)
                {
                    $j .= $this->icon[2];
                }else{
                    $j .= $this->icon[1];
                    $k = $adds ? $this->icon[0] : '';
                }
                $spacer = $adds ? $adds.$j : '';

                $selected = $this->have($sid,$id) ? 'selected' : '';
                @extract($a);
                eval("\$nstr = \"$str\";");
                $this->ret .= $nstr;
                $this->get_tree_multi($id, $str, $sid, $adds.$k.'&nbsp;');
                $number++;
            }
        }
        return $this->ret;
    }

    /**
    * @param integer $myid 要查询的ID
    * @param string $str   第一种HTML代码方式
    * @param string $str2  第二种HTML代码方式
    * @param integer $sid  默认选中
    * @param integer $adds 前缀
    */
    public function get_tree_category($myid, $str = "<span class='file'>\$name</span>", $str2 = "<span class='folder'>\$name</span>", $sid = 0, $adds = '')
    {
        $number=1;
        $child = $this->get_child($myid);
        if(is_array($child))
        {
            $total = count($child);
            foreach($child as $id=>$a)
            {
                $j=$k='';
                if($number==$total)
                {
                    $j .= $this->icon[2];
                }else{
                    $j .= $this->icon[1];
                    $k = $adds ? $this->icon[0] : '';
                }
                $spacer = $adds ? $adds.$j : '';

                $selected = $this->have($sid,$id) ? 'selected' : '';
                @extract($a);
                if (empty($html_disabled))
                {
                    eval("\$nstr = \"$str\";");
                } else {
                    eval("\$nstr = \"$str2\";");
                }
                $this->ret .= $nstr;
                $this->get_tree_category($id, $str, $str2, $sid, $adds.$k.'&nbsp;');
                $number++;
            }
        }
        return $this->ret;
    }
    

    /**
     * 同上一类方法，jquery treeview 风格，可伸缩样式（需要treeview插件支持）
     * @param $myid 表示获得这个ID下的所有子级
     * @param $effected_id 需要生成treeview目录数的id
     * @param $str 末级样式
     * @param $style 目录样式 默认 filetree 可增加其他样式如'filetree treeview-famfamfam'
     * @param $recursion 递归使用 外部调用时为FALSE
     */
    //function get_treeview($myid,$effected_id='example',$str="<span class='file'>\$name</span>", $str2="<span class='folder'>\$name</span>" ,$style='filetree ' ,$recursion=FALSE)
    function get_treeview($myid, $effected_id = 'tree', $str = "\$name", $str2 = "\$name", $style = '', $recursion = FALSE)
    {
    	
        $child = $this->get_child($myid);
        if(!defined('EFFECTED_INIT'))
        {
            $effected = ' id="'.$effected_id.'"';
            define('EFFECTED_INIT', 1);
        } else {
           $effected = '';
        }
        if(!$recursion) $this->str .='<ul'.$effected.'  class="'.$style.'">';
        foreach($child as $id=>$a)
        {
            @extract($a);
            $floder_status = isset($folder) ? ' class="'.$folder.'"' : '';
            $this->str .= $recursion ? '<ul><li'.$floder_status.' style="padding:1px 0 1px 16px">' : '<li'.$floder_status.' style="padding:1px 0 1px 16px">';
            $recursion = FALSE;
            if($this->for_get_child($id))
            {
            	
                eval("\$nstr = \"$str2\";");
                $this->str .='<div class="hitarea expandable-hitarea" id="cate'.$id.'" onclick="more_cate('.$id.')"></div>';
            	$this->str .= '<dl class="treedl" id="category'.$id.'"><dt><input type="text" name="sort['.$id.']" value="'.$sort.'"/><span title="点击直接修改" class="edit" id="'.$id.'">'.$name.'</span></dt><dd>';
            	
            	if ($myid>0){
	            	if(isset($is_search) && $is_search ==1)
	            	{
	            		$this->str .= '<a href="/pubu/is_search/'.$id.'/0/'.$module_id.'">热搜</a> | ';
	            	}
	            	else
	            	{
	            		$this->str .= '<a href="/pubu/is_search/'.$id.'/1/'.$module_id.'">非热搜</a> | ';
	            	}
            	}
				$this->str .= '<a href="javascript:if(confirm(\'确定删除此分类及其子分类？删除后将不可恢复。\'))location.href=\'/pubu/del/'.$id.'/'.$module_id.'\'">删除</a></dd>';
            	
            	//$this->get_treeview($id,$effected_id,$str,$str2,$style,TRUE);
            } else {
            	eval("\$nstr = \"$str\";");
            	
            	$this->str .= '<dl class="treedl2" id="category'.$id.'"><dt><input type="text"  name="sort['.$id.']" value="'.$sort.'"/><span title="点击直接修改" class="edit" id="'.$id.'">'.$name.'</span></dt><dd>';
            	if ($myid>0){
	            	if(isset($is_search) && $is_search ==1)
	            	{
	            		$this->str .= '<a href="/pubu/is_search/'.$id.'/0/'.$module_id.'">热搜</a> | ';
	            	}
	            	else
	            	{
	            		$this->str .= '<a href="/pubu/is_search/'.$id.'/1/'.$module_id.'">非热搜</a> | ';
	            	}
            	}
				$this->str .= '<a href="javascript:if(confirm(\'确定删除此分类？删除后将不可恢复。\'))location.href=\'/pubu/del/'.$id.'/'.$module_id.'\'">删除</a></dd>';
                
            }
            if ($myid>0){
            	$this->str .= '<dd></dd></dl>';
            }else{
            	$this->str .= '<dd><a href="/pubu/category_add/'.$id.'/'.$module_id.'" class="button sButton bSky">添加子分类</a></dd></dl>';
            }
            $this->str .=$recursion ? '</li></ul>': '</li>';
        }
        if(!$recursion)  $this->str .='</ul>';
        return $this->str;
    }


    //扩展树形
    function common_get_treeview($myid, $effected_id = 'tree', $str = "\$name", $str2 = "\$name", $style = '', $recursion = FALSE,$url = '')
    {

        $child = $this->get_child($myid);
        if(!defined('EFFECTED_INIT'))
        {
            $effected = ' id="'.$effected_id.'"';
            define('EFFECTED_INIT', 1);
        } else {
           $effected = '';
        }
        if(!$recursion) $this->str .='<ul'.$effected.'  class="'.$style.'">';
        foreach($child as $id=>$a)
        {
            @extract($a);
            $floder_status = isset($folder) ? ' class="'.$folder.'"' : '';
            $this->str .= $recursion ? '<ul><li'.$floder_status.' style="padding:1px 0 1px 16px">' : '<li'.$floder_status.' style="padding:1px 0 1px 16px">';
            $recursion = FALSE;
            if($this->car_for_get_child($id,'car_channel','car_category','category_id','parent_id'))
            {

                eval("\$nstr = \"$str2\";");
                $this->str .='<div class="hitarea expandable-hitarea" id="cate'.$id.'" onclick="more_cate('.$id.')"></div>';
            	$this->str .= '<dl class="treedl" id="category'.$id.'"><dt><input type="text" name="sort['.$id.']" value="'.$sort.'"/><span title="点击直接修改" class="edit" id="'.$id.'">'.$name.'</span></dt><dd>';
            	if(isset($disabled) && $disabled ==1)
            	{
            		$this->str .= '<a href="/'.$url.'/disable/'.$id.'/0">启用</a> | ';
            	}
            	else
            	{
            		$this->str .= '<a href="/'.$url.'/disable/'.$id.'/1">禁用</a> | ';
            	}
				if(isset($is_search) && $is_search ==1)
            	{
            		$this->str .= '<a href="/'.$url.'/issearch/'.$id.'/0">显示</a> | ';
            	}
            	else
            	{
            		$this->str .= '<a href="/'.$url.'/issearch/'.$id.'/1">隐藏</a> | ';
            	}
				$this->str .= '<a href="javascript:if(confirm(\'确定删除此分类及其子分类？删除后将不可恢复。\'))location.href=\'/'.$url.'/del/'.$id.'/cate\'">删除</a> | <a href="javascript:void(0);" onclick="gois_search('.$id.');">更改目录归属</a></dd>';
            	//$this->str .= '<dd style="width:250px;float:right;"><a href="/category/disable/'.$id.'/0">启用</a> | <a href="/category/disable/'.$id.'/1">禁用</a></dd>';
            	$this->str .= '<dd><a href="/'.$url.'/added/'.$id.'" class="button sButton bSky">添加子分类</a></dd><dd><input type="text" value="'.$id.'" readonly="readonly" style="width:50px;"/></dd></dl>';
            	//$this->get_treeview($id,$effected_id,$str,$str2,$style,TRUE);
            } else {
            	eval("\$nstr = \"$str\";");
            	$is_attr = $this->is_attr($id);
            	if ($is_attr == 1)
            	{
            		$this->str .= '<dl class="treedl2" id="category'.$id.'"><dt><input type="text"  name="sort['.$id.']" value="'.$sort.'"/><span title="点击直接修改" class="edit" id="'.$id.'">'.$name.'</span></dt>';
            	}else {
            		$this->str .= '<dl class="treedl2" id="category'.$id.'"  style="color:red;"><dt><input type="text"  name="sort['.$id.']" value="'.$sort.'"/><span title="点击直接修改" class="edit" id="'.$id.'">'.$name.'</span></dt>';
            	}

                $this->str .= '<dd><a href="/car_add_message/add/'.$id.'">添加车型参数</a> | ';
                
                $this->str .= '<a href="/'.$url.'/images_upload/'.$id.'">上传图片</a> | ';
                if(isset($disabled) && $disabled ==1)
                {
                	
                        $this->str .= '<a href="/'.$url.'/disable/'.$id.'/0">启用</a> | ';
                }
                else
                {
                	$this->str .= '<a href="/'.$url.'/disable/'.$id.'/1">禁用</a> | ';
                }

		if(isset($is_search) && $is_search ==1)
            	{
            		$this->str .= '<a href="/'.$url.'/issearch/'.$id.'/0">显示</a> | ';
            	}
            	else
            	{
            		$this->str .= '<a href="/'.$url.'/issearch/'.$id.'/1">隐藏</a> | ';
            	}
				$this->str .= '<a href="javascript:if(confirm(\'确定删除此分类？删除后将不可恢复。\'))location.href=\'/'.$url.'/del/'.$id.'/cate\'">删除</a> | <a href="javascript:void(0);" onclick="gois_search('.$id.');">更改目录归属</a></dd>';
                               
                //$this->str .= '<dd style="width:250px;float:right;"><a href="/category/arrtibute/'.$id.'">编辑分类属性</a> | <a href="/category/disable/'.$id.'/'.$disabled.'">停用</a></dd>';
                $this->str .= '<dd><a href="/'.$url.'/added/'.$id.'" class="button sButton bSky">添加子分类</a></dd><dd><input type="text" value="'.$id.'" readonly="readonly" style="width:50px;"/></dd></dl>';
            }
            $this->str .=$recursion ? '</li></ul>': '</li>';
        }
        if(!$recursion)  $this->str .='</ul>';
        return $this->str;
    }





    private function have($list,$item)
    {
        return(strpos(',,'.$list.',',','.$item.','));
    }
}